package com.mlethe.library.socialtool.core;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;

import com.mlethe.library.socialtool.callback.OauthActionListener;
import com.mlethe.library.socialtool.callback.PayActionListener;
import com.out.UPAuthStart;
import com.unionpay.UPPayAssistEx;
import com.unionpay.UPQuerySEPayInfoCallback;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.HashMap;

/**
 * 中国银联（云闪付）
 *
 * @author Mlethe
 */
public class UnionPay implements Oauth {

    private Context mContext;
    private String appId;
    /**
     * 用于进行业务流程的 Id
     */
    private String planid;

    /*****************************************************************
     * mMode参数解释： "00" - 启动银联正式环境 "01" - 连接银联测试环境
     *****************************************************************/
    private String mMode = "00";

    /**
     * 是否验证支付签名
     */
    private boolean isVerify;

    private OauthActionListener mOauthListener;
    private PayActionListener mPayListener;

    public UnionPay(Context context, String appId, String planid) {
        this.mContext = context;
        this.appId = appId;
        this.planid = planid;
    }

    /**
     * 授权登录
     *
     * @param activity
     * @param scope    基于登录用户实名绑卡信息，提供三种不同的授权域 upapi_user：，upapi_pay：，upapi_login：
     * @return 表示传入参数是否合法, 若非法直接返回，不会启动云闪付 true:合法 false:非法
     */
    public boolean oauth(Activity activity, String scope) {
        return UPAuthStart.LaunchUPActivity(activity, appId, scope);
    }

    /**
     * 授权登录
     *
     * @param activity
     * @param scope    基于登录用户实名绑卡信息，提供三种不同的授权域 upapi_user：，upapi_pay：，upapi_login：，upapi_contract：
     * @return 表示传入参数是否合法, 若非法直接返回，不会启动云闪付 true:合法 false:非法
     */
    public boolean oauthNonSign(Activity activity, String scope) {
        return UPAuthStart.nonSecertSigning(activity, appId, scope, planid);
    }

    /**
     * 授权登录回调
     * 请在调用 oauth() 方法前调用
     *
     * @param listener listener
     * @return
     */
    public UnionPay setOauthActionListener(OauthActionListener listener) {
        this.mOauthListener = listener;
        return this;
    }

    /**
     * 支付回调
     * 请在调用 pay() 方法前调用
     *
     * @param listener listener
     * @return
     */
    public UnionPay setPayActionListener(PayActionListener listener) {
        this.mPayListener = listener;
        return this;
    }

    /**
     * 是否验证支付签名
     * 请在调用 pay() 方法前调用
     *
     * @param verify
     * @return
     */
    public UnionPay setVerify(boolean verify) {
        isVerify = verify;
        return this;
    }

    /**
     * 调起支付(普通支付接口)
     *
     * @param tn 交易流水号
     */
    public void pay(String tn) {
        if (!isAppInstalled()) {
            if (mPayListener != null) {
                mPayListener.onNotInstalled(Platform.UNIONPAY);
                mPayListener = null;
            }
            return;
        }
        UPPayAssistEx.startPay(mContext, null, null, tn, mMode);
    }

    /**
     * 检查手机pay状态
     *
     * @param callback
     */
    public void getSEPayinfo(UPQuerySEPayInfoCallback callback) {
        if (!isAppInstalled()) {
            if (callback != null) {
                callback.onError(null, null, "1", null);
                callback = null;
            }
            return;
        }
        UPPayAssistEx.getSEPayInfo(mContext, callback);
    }

    /**
     * 调起支付(手机 pay 支付)
     * 请在调用 getSEPayinfo() 方法后调用
     *
     * @param tn     交易流水号
     * @param seType 手机pay支付类别：02 Samsung Pay，04 Huawei Pay，27 Meizu Pay，30 Le Pay，25 Mi Pay，29 OPPO Pay，33 vivo Pay，32 Smartisan Pay
     */
    public void pay(String tn, String seType) {
        if (!isAppInstalled()) {
            if (mPayListener != null) {
                mPayListener.onNotInstalled(Platform.UNIONPAY);
                mPayListener = null;
            }
            return;
        }
        UPPayAssistEx.startSEPay(mContext, null, null, tn, mMode, seType);
    }

    /**
     * 接收支付成功后返回的数据
     *
     * @param requestCode
     * @param resultCode
     * @param data
     */
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (data == null) {
            return;
        }
        try {
            if (requestCode == 1 || requestCode == 2) {
                // 授权登录
                HashMap<String, String> map = UPAuthStart.UPAuthActivityResult(data);
                if (map != null) {
                    String status = map.get("status_code");
                    if ("00".equals(status)) {
                        // 成功
                        JSONObject jsonObject = new JSONObject();
                        jsonObject.put("authcode", map.get("authcode"));
                        if (mOauthListener != null) {
                            mOauthListener.onComplete(Platform.UNIONPAY, jsonObject);
                            mOauthListener = null;
                        }
                    } else if ("01".equals(status)) {
                        // 取消
                        if (mOauthListener != null) {
                            mOauthListener.onCancel(Platform.UNIONPAY);
                            mOauthListener = null;
                        }
                    } else if ("02".equals(status)) {
                        // 失败
                        if (mOauthListener != null) {
                            mOauthListener.onFail(Platform.UNIONPAY);
                            mOauthListener = null;
                        }
                    } else {
                        // 未知错误
                        if (mOauthListener != null) {
                            mOauthListener.onFail(Platform.UNIONPAY);
                            mOauthListener = null;
                        }
                    }
                }
            } else if (requestCode == 10) {
                // 支付
                if (resultCode != Activity.RESULT_OK) {
                    if (mPayListener != null) {
                        mPayListener.onFail(Platform.UNIONPAY);
                        mPayListener = null;
                    }
                    return;
                }

                /**
                 * 支付控件返回字符串:success、fail、cancel 分别代表支付成功，支付失败，支付取消
                 */
                String str = data.getStringExtra("pay_result");
                if ("success".equalsIgnoreCase(str)) {
                    if (isVerify) {
                        // 如果想对结果数据验签，可使用下面这段代码，但建议不验签，直接去商户后台查询交易结果
                        // result_data结构见c）result_data参数说明
                        if (data.hasExtra("result_data")) {
                            // 结果result_data为成功时，去商户后台查询一下再展示成功
                            String result = data.getStringExtra("result_data");
                            try {
                                JSONObject resultJson = new JSONObject(result);
                                // 此处的verify建议送去商户后台做验签
                                // 如要放在手机端验，则代码必须支持更新证书
                                if (mPayListener != null) {
                                    mPayListener.onComplete(Platform.UNIONPAY, resultJson);
                                    mPayListener = null;
                                }
                            } catch (JSONException e) {
                                if (mPayListener != null) {
                                    mPayListener.onFail(Platform.UNIONPAY);
                                    mPayListener = null;
                                }
                            }
                        } else {
                            if (mPayListener != null) {
                                mPayListener.onFail(Platform.UNIONPAY);
                                mPayListener = null;
                            }
                        }
                    } else {
                        JSONObject resultJson = new JSONObject();
                        if (mPayListener != null) {
                            mPayListener.onComplete(Platform.UNIONPAY, resultJson);
                            mPayListener = null;
                        }
                    }
                } else if ("fail".equalsIgnoreCase(str)) {
                    if (mPayListener != null) {
                        mPayListener.onFail(Platform.UNIONPAY);
                        mPayListener = null;
                    }
                } else if ("cancel".equalsIgnoreCase(str)) {
                    if (mPayListener != null) {
                        mPayListener.onCancel(Platform.UNIONPAY);
                        mPayListener = null;
                    }
                }
            }
        } catch (JSONException e) {
            mOauthListener = null;
            mPayListener = null;
            e.printStackTrace();
        }
    }

    @Override
    public Object getApi() {
        return null;
    }

    /**
     * 判断是否安装
     *
     * @return
     */
    @Override
    public boolean isAppInstalled() {
        if (!UPPayAssistEx.checkWalletInstalled(mContext)) {
            return false;
        }
        return true;
    }

    @Override
    public void unregister() {

    }

    @Override
    public void release() {
        unregister();
        mContext = null;
        mOauthListener = null;
        mPayListener = null;
    }
}
